<?php
/**
 * 
 * MySQL kezelő osztály
 * 
 * @author NewPlayer
 *
 */
class mysql_class
{
	var $mysql; // MySQL kapcsolat azonosító
	var $mysql_error, $mysql_errorno; // MySQL hiba azonosító és hibaszám
	var $mysql_query; // MySQL query azonosító
	var $mysql_num_rows; // A lekérdezés által érintett sorok száma
	var $debug; // Amennyiben debug-oljuk a lekérdezéseket, akkor itt tárolódnak a lekérdezések
	var $query;
	var $query_type;
	
	/**
	 * 
	 * kapcsolat kiépítése és tábla kijelölése
	 */
	function __construct(){
			
		// Csatlakozás a MySQL szerverhez
		if ( !$this->mysql = @mysql_connect( MYSQL_SERVER, MYSQL_USER, MYSQL_PASSWORD ) ){
			
			//TODO: megcsinálni, hogy ne akadjon ki teljesen a rendszer
			die("Error, Code:1");
		}
		
		// Csatlakozás a táblához
		if ( !$select_db = @mysql_select_db(MYSQL_DB , $this->mysql) ){
			
			//TODO: megcsinálni, hogy ne akadjon ki teljesen a rendszer
			die("Error, Code:2");
		}
	}
	
	/**
	 * 
	 * Ezt NE használjuk!
	 * MySQL lekérdezés átadása az adatbázisnak
	 * Használata előtt be kell állítani a query_type osztály változót
	 * 
	 * @param string $query a mysql lekérdezés 
	 * 
	 * @return boolean Sikeres lekérdezés esetén TRUE, minden más esetben FALSE
	 * 
	 * @tutorial mysql_query("SELECT * FROM `users`");
	 */
	function mysql_query($query){

		$this->mysql_query = @mysql_query($query, $this->mysql );
		
		// Hiba esetén
		if ($this->mysql_query === FALSE){
			
			// Hiba üzenet és azonosító beállítása
			$this->mysql_error = mysql_error($this->mysql);
			$this->mysql_errorno = mysql_errno($this->mysql);
			
			$return = FALSE; // hibatörtént visszatérés FALSE értékkel
		} else {
			
			// Nincsen hiba
			$this->mysql_error = FALSE;
			$this->mysql_errorno = FALSE;

			$return = TRUE;
		}
		
		// érintett sorok számának lekérdezése a lekérdezés típusa alapján
		switch ( $this->query_type ) {
			
			case "select":
				
				$this->mysql_num_rows = mysql_num_rows( $this->mysql_query );
			break;
			
			case "update":
				
				$this->mysql_num_rows = mysql_affected_rows( $this->mysql_query );
			break;
			
			default:
				
				$this->mysql_num_rows = 0;
			break;
		}
		
		// loggolás, ha engedélyezve van
		if ( SQL_DEBUG === TRUE ){
				
			$this->debug[] = array(
				"type" => $this->query_type,
				"query" => $this->query,
				"rows" => $this->mysql_num_rows,
				"error" => $this->mysql_errorno,
				"error_message" => $this->mysql_error,
				"time" => time()
			);
		}
		
		return $return; 
	}

	/**
	 * 
	 * Adatok lekérdezése
	 * 
	 * @param array|string $table_name Tábla név
	 * @param array|string $rows Oszlopok
	 * @param string $where Where lekérdezés
	 * @param string $order_by Rendezés
	 * @param string $limit Limit
	 * @param string $group_by Csoportosítás
	 * @param string $query Szabad query, ami a lekérdezés végén kerül elhelyezésre
	 * 
	 * @return boolean A lekérdezés eredménye
	 */
	function mysql_select( $table_name, $rows, $where = "", $order_by = "", $limit = "", $group_by = "", $query = "" ){
		
		if ( is_array( $table_name ) ){
			
			$table_name = "`".implode("`, `",$table_name)."`";
		} else {
			
			$table_name = "`".$table_name."`";
		}
		
		if ( is_array( $rows ) ){
						  
			$rows = "`".implode("`, `",$rows)."`";
		}
		
		if ( $where <> "" ){
			
			$where = " WHERE ".$where;
		}
		
		if ($group_by<>""){
			
			$group_by = " GROUP BY ".$group_by;
		}
		
		if ($order_by<>""){
			
			$order_by = " ORDER BY ".$order_by;
		}
		
		if ($limit<>""){
			
			$limit = " LIMIT ".$limit;
		}
		
		$this->query = "SELECT ".$rows." FROM ".$table_name.$where.$group_by.$order_by.$limit.$query;
		$this->query_type = "select";
		
		return $this->mysql_query( $this->query );
	}
	
	/**
	 * 
	 * Select után egy sor visszaadása
	 * 
	 * @return Array Egy lekérdezett sor
	 */
	function get_line(){
		
		return mysql_fetch_assoc($this->mysql_query);
	}
	
	/**
	 * 
	 * Egész lekérdezett táblázat visszaadása
	 * 
	 * @return Array A lekérdezett táblázatos formában
	 */
	function get_table(){
		
		$table = array();
		while ( $row = $this->get_line() ){
			
			$table[] = $row;
		}
		
		return $table;
	}
	
	/**
	 * 
	 * Adatok beillesztése
	 * 
	 * @param String $table_name - Tábla
	 * @param Array $data - Adatok
	 * 
	 * @return Integer/Boolean Sikeres lekérdezés esetén a hozzáadott sor azonosítója, hiba esetén FALSE
	 */
	function mysql_insert($table_name, $data){
		
		//$table_name = "`".$table_name."`";
		
		$this->query = "INSERT INTO `".$table_name."` (`".implode( "`,`", array_keys( $data ) )."`) VALUES ('".implode( "','", $data )."')";
		$this->query_type = "insert";
		
		// ha a lekérdezés hiba nélkül megy végbe, akkor visszatérési érték a beszúrt sor száma
		if ( $this->mysql_query( $this->query ) ){
			
			return  mysql_insert_id();
		}else{
			
			return FALSE;
		}
	}
	
	/**
	 * 
	 * Adatok törlése
	 * 
	 * @param $table_name Tábla név
	 * @param $where Where lekérdezés
	 * @param $query Mindenféle egyéb
	 * 
	 * @return Boolean A lekérdezés eredménye
	 */
	function mysql_delete($table_name, $where = "", $query = ""){
		
		if ( is_array( $table_name ) ){
			
			$table_name = "`".implode( "`, `", $table_name )."`";
		} else {
			
			$table_name = "`".$table_name."`";
		}
		
		if ( $where <> "" ){
			
			$where = " WHERE ".$where;
		}
		
		$this->query = "DELETE FROM ".$table_name.$where.$query;
		$this->query_type = "delete";
		
		return $this->mysql_query( $this->query );
	}
	
	/**
	 * 
	 * Adatok frissításe az adatbázisban
	 * 
	 * @param $table_name Tábla név
	 * @param $where Where lekérdezés
	 * @param $query Mindenféle egyéb
	 * 
	 * @return Boolean A lekérdezés eredménye
	 */
	function mysql_update( $table_name, $data, $where = "", $query = "" ){
		
		if ( is_array( $table_name ) ){
			
			$table_name = "`".implode( "`, `", $table_name )."`";
		}else{
			
			$table_name = "`".$table_name."`";
		}
		
		// Módosítási értékek hozzáadása a lekérdezéshez
		$i = 1;
		foreach ( $data as $row => $index ){
				
			$data_string .= "`".$row."` = '".$index."'";
			
			//print count($data)." ".$i."<br>";
			if ( $i++ <> count( $data ) ){
				
				$data_string .= ", ";
			}
		}
		
		$data = $data_string;
		
		if ( $where <> "" ){
			
			$where = " WHERE ".$where;
		}
		
		$this->query = "UPDATE ".$table_name." SET ".$data.$where.$query;
		$this->query_type = "update";
		
		return $this->mysql_query( $this->query );
	}
	
	/**
	 * 
	 * utolsó sql lekérdezés hány sort érintett
	 */
	function get_mysql_num_row(){
		
		return $this->mysql_num_rows;
	}
	
	/**
	 * 
	 * sql kapcsolat lezárása, és debug információk kiírása
	 */
	function mysql_close(){
		
		@mysql_close( $this->mysql );
		
		if ( SQL_DEBUG === true ){
			
			print "<pre class='sql_debug'>";
			
				print_r( $this->debug );
				
			print "</pre>";
		}
	}
	
	/**
	 * 
	 * Szövegek escapelése
	 * @param String $string az escapelendő szöveg
	 * 
	 * @return String Az escapelt szöveg
	 */
	function escape( $string ){
		
		return mysql_real_escape_string( $string, $this->mysql );
	}
}

?>